package net.comfycastle.musicplayer;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * BaseActivity 기반의 리스트 액티비티들 안에서 현재 재생 정보를 출력하기 위한 프래그먼트
 * @author ricale
 *
 */
public class NowPlayingInfoFragment extends Fragment {
	///////////
	//////////
	/////////   variable
	
	/** 자신의 갖고 있는 레이아웃 중 최상위 레이아웃 */
	private LinearLayout mLayout;
	/** 현재 재생 정보를 출력할 텍스트뷰 */
	private TextView     mTvMain;
	
	/** 현재 재생 정보를 듣기 위해 방송을 수신하고 있는가 */
	private boolean mIsReceivedNow;

	///////////
	//////////
	/////////   lifecycle callback method
	
	/**
	 * FragNowPlaying의 초기화 콜백 메소드
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mIsReceivedNow = false;
	} // end onCreate
	
	/**
	 * FragNowPlaying이 액티비티에 붙을 때 자신의 레이아웃을 리턴하는 콜백 메소드
	 */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		mLayout = (LinearLayout)inflater.inflate(R.layout.nowplayinginfo, container, false);
		mLayout.setOnClickListener(mOnClick);
		mTvMain = (TextView)mLayout.findViewById(R.id.nowplayinginfo_main);
		return (View)mLayout;
	} // end onCreateView
	
	/**
	 * 자신이 활성화되었을 때를 위한 콜백 메소드
	 * 주로 현재 재생 정보를 듣기 위해 방송을 켠다
	 */
	@Override
	public void onResume() {
		super.onResume();
		turnonBR();
	} // end onResume
	
	/**
	 * 자신이 비활성화되었을 때를 위한 콜백 메소드
	 * 주로 현재 재생 정보를 듣기 위해 켜두었던 방송을 끈다
	 */
	@Override
	public void onPause() {
		super.onPause();
		turnoffBR();
	} // end onPause
	
	///////////
	//////////
	/////////   setter
	
	/**
	 * 현재 재생 정보를 출력한다.
	 * @param text 현재 재생 정보 (곡명)
	 */
	private void setText() {
		mTvMain.setText(MusicUtility.getTitle());
	} // end setText
	
	///////////
	//////////
	/////////   methods

	/**
	 * 현재 재생 정보를 듣기 위해 방송을 켠다.
	 * 방송이 이미 켜져 있으면 아무런 효과가 없다.
	 */
	private void turnonBR() {
		if(!mIsReceivedNow) {
			IntentFilter filter = new IntentFilter();
			filter.addAction(MPApp.BR_MEDIAPLAYER_PREPARE);
			getActivity().registerReceiver(mMPPrepareBr, filter);
			mIsReceivedNow = true;
			
			setText();
		} // end if
	} // end turnonBR
	
	/**
	 * 현재 재생 정보를 듣기 위해 틀었던 방송을 끈다.
	 * 방송이 이미 꺼져 있으면 아무런 효과가 없다.
	 */
	public void turnoffBR() {
		if(mIsReceivedNow) {
			getActivity().unregisterReceiver(mMPPrepareBr);
			mIsReceivedNow = false;
		} // end if
	} // end turnoffBR
	
	///////////
	//////////
	/////////   event listener & callback method
	
	/**
	 * 자신을 클릭했을 때를 위한 이벤트 리스너
	 * 상세 재생 정보(PlayActivity)를 보여 준다.
	 */
	private View.OnClickListener mOnClick = new View.OnClickListener() {
		public void onClick(View v) {
			Activity parent = getActivity();
			String action = parent.getIntent().getAction();
			if(action.equals(MPApp.ACT_SHOW_PLAYLIST_INALBUM) || action.equals(MPApp.ACT_SHOW_PLAYLIST_INGROUP)) {
				Intent intent = new Intent();
				intent.setAction(MPApp.ACT_SHOW_PLAYING);
				
				parent.setResult(Activity.RESULT_OK, intent);
				parent.finish();
			} else {
				Intent intent = new Intent(parent, PlayActivity.class);
				intent.setAction(MPApp.ACT_SHOW_PLAYING);
				
				parent.startActivity(intent);
			} // end if
		} // end onClick
	}; // end mOnClick
	
	///////////
	//////////
	/////////   broadcast receiver
	
	/**
	 * 방송 수신 리스너 (BR)
	 * 방송을 들으면 바로 현재 재생 정보를 출력한다.
	 */
	private BroadcastReceiver mMPPrepareBr = new BroadcastReceiver() {
		/**
		 * 방송 수신 콜백 메서드
		 */
		public void onReceive(Context context, Intent intent) {		    
			setText();
		} // end onReceive
	}; // end mMPPrepareBr
} // end FragNowPlaying